import random
import numpy as np
import matplotlib.pyplot as plt

# 定义每次轰炸击中的概率
hit_probability = 0.95

# 设定总的轰炸次数
total_bombs = 2000

# 初始化一个列表来保存每次轰炸的结果
bombs_per_target = [0] * 30

# 初始化一个列表来保存每次模拟的摧毁目标数量
simulation_results = []

# 开始模拟
for _ in range(total_bombs):
    # 生成一个0-1之间的随机数，代表是否击中目标
    if np.random.rand() < hit_probability:
        # 选择一个目标进行轰炸
        target = np.random.randint(30)
        # 如果目标已经被击中过，则继续轰炸
        if bombs_per_target[target] > 0:
            continue
        else:
            bombs_per_target[target] += 1
    # 如果目标没有被击中，那么增加已轰炸次数
    else:
        total_bombs += 1

    # 计算已经摧毁的目标数量
    destroyed_targets = sum([1 for count in bombs_per_target if count > 0])
    simulation_results.append(destroyed_targets)

# 计算平均需要的轰炸次数
average_bombs = sum(simulation_results) / len(simulation_results)

# 绘制模拟结果图像
num_simulations = len(simulation_results)
num_rows = 10
num_cols = num_simulations // num_rows

fig, axs = plt.subplots(num_rows, num_cols, figsize=(15, 15))

for i, ax in enumerate(axs.flat):
    if i < num_simulations:
        ax.plot(range(1, len(simulation_results[:i+1]) + 1), simulation_results[:i+1])
        ax.set_xlabel('Number of Bombs')
        ax.set_ylabel('Destroyed Targets')
        ax.set_title(f'Simulation {i+1}')

# 隐藏多余的子图
for j in range(num_simulations, num_rows * num_cols):
    fig.delaxes(axs.flat[j])

plt.tight_layout()
plt.show()

print(f"平均每个目标需要 {average_bombs:.2f} 次轰炸。")
